home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1997 July
/
EnigmA AMIGA RUN 20 (1997)(G.R. Edizioni)(IT)[!][issue 1997-07 & 08][EAR-CD IV].iso
/
earcd
/
dev
/
amos
/
moreusel.lha
/
HunkExtract.AMOS
/
HunkExtract.amosSourceCode
Wrap
AMOS Source Code
|
1997-04-18
|
6KB
|
217 lines
' ***************************************
' * *
' * Hunk Extract V1.1 gamma *
' * Written by Chris Hodges *
' * *
' ***************************************
'
Dim HL(100)
P$=Command Line$
Screen Open 0,640,256,2,$8000
Curs Off
Centre "Hunk Extract V1.1gamma" : Print
Centre "Written by Chris Hodges" : Print : Print
If P$=""
Print "This tool enables you to rip memory banks out of compiled AMOS programs."
Print "Currently it works with AMOS Creator and AMOS Professional executables,"
Print "AMOS-squashed and unpacked. The only exception: old AMOS Creator Sprite banks"
Print "can be saved, but cannot be reloaded into AMOS (so don't try to do that)."
Print "I'll try to write a special save-routine for the next version."
Print
Print "Rip and enjoy.."
Print
Print "Press any key to continue..."
Repeat
I$=Inkey$ : Multi Wait
Until I$<>""
Cls
End If
Repeat
Gosub RIPHUNKS
Print String$("-",80);
Print "Another file (Y/N)? ";
Repeat
I$=Upper$(Inkey$) : Multi Wait
Until I$="N" or I$="Y"
Print I$
Until I$="N"
End
RIPHUNKS:
If P$=""
F$=Fsel$("","","Select an unpacked","AMOS executable")
If F$="" : End : End If
Else
F$=P$ : P$=""
End If
If Exist(F$)=0 Then Print "File not found!" : Return
Print "Loading: ";F$
Extension_8_0456 F$,9
ST=Start(9)
If Leek(ST)<>$3F3 Then Print "Not an executable!" : Return
Add ST,4
While Leek(ST)
Add ST,Leek(ST)*4+4
Wend
Add ST,4
NH=Leek(ST)
SH=Leek(ST+4)
LH=Leek(ST+8)
Add ST,12
Print "Hunks:";NH
Print "First:";SH
Print "Last :";LH
For A=SH To LH
HL(A)=Leek(ST)*4 : Add ST,4
Print "Hunk";A;" Length:";HL(A)
Next
For A=SH To LH
HT=Leek(ST) and $FFFFFF : HL=Leek(ST+4)*4 : Add ST,8
Print "Hunk";A;": ID=";Hex$(HT,8)
If HL<>HL(A) Then Print "Error: Length error";HL;"<>";HL(A)
If HT=$3EB Then HL=4
If HT=$3E9 or HT=$3EA
OST=ST : OHL=HL
BN=Leek(ST) : ABN$=Peek$(ST+8,8)
If BN= Extension_8_0998("xVdg")
Gosub CRUNCHED
BN=Leek(ST) : ABN$=Peek$(ST+8,8)
End If
If BN= Extension_8_0998("AmSp")
Print String$("-",80);
Print "Found AMOS Pro sprite bank"
BN$="Sprites.abk"
Gosub FSPRITE
End If
If BN= Extension_8_0998("AmIc")
Print String$("-",80);
Print "Found AMOS Pro icons bank"
BN$="Icons.abk"
Gosub FSPRITE
End If
FL=Deek(ST+4)
For B=1 To 8
P=Asc(Mid$(ABN$,B,1))
Exit If P<32 or P>127
Next
If B=9
If ABN$="Sprites " or ABN$="Icons "
If ABN$="Sprites "
Print String$("-",80);
Print "Found AMOS Creator sprite bank"
BN$="Sprites.abk" : ID$="AmSp"
Else
Print String$("-",80);
Print "Found AMOS Creator icons bank"
BN$="Icons.abk" : ID$="AmIc"
End If
Gosub FSPRITECREATOR
Else
If Abs((BN and $FFFFFFC)-HL)<17 and((FL and $FFFFFF)<17)
BL=(BN and $FFFFFFC) : BN=(FL and $FFFFFFF)
FL= Extension_8_093A(Peek(ST),6)
Print String$("-",80);
Print "Probably found bank: AMOS Creator"
Gosub FBANK
Print
Else
If(BN and $FFFFFFF)<$8000
BL=HL-16 : BN=BN and $FFFFFFF
Print String$("-",80);
Print "Probably found bank: AMOS Pro"
Gosub FBANK
Print
End If
End If
End If
End If
ST=OST : HL=OHL
Add ST,HL
Do
HE=Leek(ST) : Add ST,4
Exit If HE=$3F2
If HE<$3EC or HE>$3EE
Print "Warning: Unknown hunk ID=";Hex$(HE,8)
Else
Print "Warning: Hunk has reloc table (maybe not AMOS!)"
End If
Do
AO=Leek(ST) : Add ST,4
Exit If AO=0
HN=Leek(ST) : Add ST,4+AO*4
Loop
Loop
Else
Add ST,HL
End If
Erase 10
Next
Erase 9
Print "No more hunks in file."
Return
CRUNCHED:
LP=Leek(ST+4)
L=Leek(ST+8)
Print "Hunk is squashed. Packed:";L;At(35,);"Unpacked:";LP;At(55,);"Rate:";100-((L*100)/LP);"%"
Reserve As Work 10,LP
Copy ST+12,ST+12+L To Start(10)
ST=Start(10)
X= Extension_5_00E4(ST,L)
' HL=(Leek(ST) and $FFFFFFC)+8
HL=LP
Return
FSPRITE:
Print "Images:";Deek(ST+4);
If Deek(ST+4)=39 Then Print " (Probably mouse.abk)" Else Print
Print "Save bank (Y/N)? ";
Repeat
I$=Upper$(Inkey$) : Multi Wait
Until I$="N" or I$="Y"
Print I$
If I$="N" Then Return
F$=Fsel$("",BN$,"Enter name for","the bank")
If F$="" Then Return
Print "Saving: ";F$
Bsave F$,ST To ST+HL
Return
FSPRITECREATOR:
Print "Images:";BN
Print "Save bank (Y/N)? ";
Repeat
I$=Upper$(Inkey$) : Multi Wait
Until I$="N" or I$="Y"
Print I$
If I$="N" Then Return
F$=Fsel$("",BN$,"Enter name for","the bank")
If F$="" Then Return
Print "Saving: ";F$
Open Out 1,F$
Print #1,ID$;
Ssave 1,ST+16 To ST+HL
Close 1
Return
FBANK:
Print "Number:";BN
Print "Flags : ";Hex$(FL,4)
Print "Length:";BL
Print "Name : ";ABN$
Print "Save bank (Y/N)? ";
Repeat
I$=Upper$(Inkey$) : Multi Wait
Until I$="N" or I$="Y"
Print I$
If I$="N" Then Return
Print "Save as raw (Y/N)? ";
Repeat
I$=Upper$(Inkey$) : Multi Wait
Until I$="N" or I$="Y"
Print I$
BN$="Bank"+Mid$(Str$(BN),2)
If I$="N" Then BN$=BN$+".Abk"
F$=Fsel$("",BN$,"Enter name for","Bank"+Str$(BN))
If F$="" Then Return
Print "Saving: ";F$
Open Out 1,F$
If I$="N" Then Print #1,"AmBk"+ Extension_8_08D2(BN)+ Extension_8_08D2(FL)+ Extension_8_08D2(BL+8)+ABN$;
Ssave 1,ST+16 To ST+BL+16
Close 1
Return